home *** CD-ROM | disk | FTP | other *** search
/ Aminet 33 / Aminet 33 - October 1999.iso / Aminet / dev / misc / Bump.lha / Bump / Bump.c < prev    next >
Encoding:
C/C++ Source or Header  |  1999-08-11  |  6.2 KB  |  201 lines

  1. /* Bump.c ©1999 Robin Cloutman. All Rights Reserved. */
  2.  
  3. #include <dos/dos.h>
  4. #include    <dos/datetime.h>
  5. #include    <dos/rdargs.h>
  6. #include    <dos/var.h>
  7. #include    <exec/memory.h>
  8. #include    <inline/dos.h>
  9. #include    <inline/exec.h>
  10.  
  11. #include    "Bump.h"
  12. #include    "Bump_rev.h"
  13.  
  14. /*
  15.  * GCC libnix options...
  16.  */
  17. int    __nocommandline = 1;
  18. int    __initlibraries = 0;
  19.  
  20. /*
  21.  * Global data...
  22.  */
  23. const char version[]    = VERSTAG "©1999 Robin Cloutman";
  24. const char defpath[]    = DEFPATH;
  25. const char revver[]    = "_rev.ver";
  26. char ld[]                = "%ld";
  27. char ldld[]                = "%ld.%ld\n";
  28. char showver[]            = "$VER: %n %v.%r (%d)\n";
  29. char prefix[]            = PREFIX;
  30. char varname[]            = VARNAME;
  31. char vers[]                = VERS;
  32. char template[]        = TEMPLATE;
  33.  
  34. /*
  35.  * Code...
  36.  */
  37. int main( void )
  38. {
  39.     struct Library *SysBase = NULL;
  40.     struct Library *DOSBase = NULL;
  41.     int ret = RETURN_OK;
  42.  
  43.     SysBase = (*((struct Library **)4));
  44.     if ( ( DOSBase = OpenLibrary( DOSNAME, 36 ) ) == NULL )ret = RETURN_FAIL;
  45.     else {
  46.         struct RDArgs    *rargs;
  47.         long args[ARGS_count] = { NULL, 0, 0, 0, 0, FALSE };
  48.  
  49.         if ( !( rargs = ReadArgs( template, args, NULL ) ) )ret = RETURN_ERROR, PrintFault( ERROR_REQUIRED_ARG_MISSING, NULL );
  50.         else {
  51.             BPTR file = NULL, outfile = NULL;
  52.             char filename[MAX_BUFFER], path[MAX_BUFFER], code[MAX_BUFFER], buffer[MAX_BUFFER], *name = NULL, *buf, **files = (char **)args[ARGS_code];
  53.             unsigned long oldver = 0, ver = 0, oldrev = 0, rev = 0, namelen = 0, codelen = 0, n = 0;
  54.  
  55.             for( name = (char *)args[ARGS_name] ; namelen <= ( MAX_BUFFER - 8 ) && name[namelen] != '\0' ; namelen++ ) filename[namelen] = name[namelen];
  56.             name = FilePart( (char *)args[ARGS_name] );
  57.             strcat( namelen, filename, revver );
  58.             namelen += 5;
  59.             if ( ( file = Open( filename, MODE_OLDFILE ) ) )
  60.             {
  61.                 if ( Read( file, buffer, MAX_BUFFER ) )
  62.                 {
  63.                     n = StrToLong( &buffer[0], &oldver );
  64.                     if ( n && n != -1 && buffer[n] == '.' )StrToLong( &buffer[++n], &oldrev );
  65.                 }
  66.                 Close( file );
  67.             }
  68.             rev = oldrev;
  69.             ver = oldver;
  70.             if ( args[ARGS_version] )ver++, rev = 0;
  71.             else if ( !args[ARGS_norevision] )rev++;
  72.             if ( args[ARGS_setrevision] )rev = (unsigned long)(*((long **)args[ARGS_setrevision]));
  73.             if ( args[ARGS_setversion] )ver = (unsigned long)(*((long **)args[ARGS_setversion]));
  74.             if ( ver != oldver || rev != oldrev )
  75.             {
  76.                 if ( ( file = Open( filename, MODE_NEWFILE ) ) )
  77.                 {
  78.                     FPrintf( file, ldld, ver, rev );
  79.                     Close( file );
  80.                 }
  81.                 if ( !args[ARGS_quiet] )bust_me( Output(), showver, name, ver, rev, DOSBase );
  82.             }
  83.             buf = PathPart( strcat( 0, path, (char *)args[ARGS_name] ) );
  84.             buf[0] = '\0';
  85.             for ( file = NULL ; *files ; files++, file = outfile = NULL )
  86.             {
  87.                 strcat( 0, code, path );
  88.                 if ( code[0] != '\0' && AddPart( code, prefix, MAX_BUFFER ) )file = Open( strcat2( code, *files ), MODE_OLDFILE );
  89.                 if ( !file && ( file = Open( strcat2( strcat( 0, code, prefix ), *files ), MODE_OLDFILE ) ) == NULL )
  90.                     if ( AddPart( strcat( 0, code, defpath ), prefix, MAX_BUFFER ) && ( file = Open( strcat2( code, *files ), MODE_OLDFILE ) ) == NULL )
  91.                         if ( ( codelen = GetVar( varname, code, MAX_BUFFER, 0 ) ) != -1 )
  92.                             if ( AddPart( code, prefix, MAX_BUFFER ) )
  93.                                 file = Open( strcat2( code, *files ), MODE_OLDFILE );
  94.                 if ( !file )break;
  95.                 while ( ( buf = FGets( file, &buffer[0], MAX_BUFFER-1 ) ) != NULL )if ( buf[0] == '#' && buf[1] == '#' )
  96.                 {
  97.                     for ( buf += 2 ; *buf == ' ' ; buf++ );
  98.                     if ( ( n = strcmp( "suffix", buf ) ) )
  99.                     {
  100.                         for ( buf += n, n = 0 ; *buf == ' ' ; buf++ )n++;
  101.                         if ( outfile )Close( outfile );
  102.                         if ( MAX_BUFFER-namelen-n > 0 )
  103.                         {
  104.                             buf[MAX_BUFFER-namelen-n] = '\0';
  105.                             outfile = Open( strcat( namelen, filename, buf ), MODE_NEWFILE );
  106.                         } else outfile = NULL;
  107.                     }
  108.                     else if ( ( n = strcmp( "inform", buf ) ) )
  109.                     {
  110.                         for ( buf += n ; *buf == ' ' ; buf++ );
  111.                         if ( !args[ARGS_quiet] )bust_me( Output(), buf, name, ver, rev, DOSBase );
  112.                     }
  113.                     else if ( ( n = strcmp( "filename", buf ) ) )
  114.                     {
  115.                         for ( buf += n ; *buf == ' ' ; buf++ );
  116.                         if ( outfile )Close( outfile );
  117.                         strcat( 0, code, path );
  118.                         if ( AddPart( code, buf, MAX_BUFFER ) )
  119.                         {
  120.                             for ( buf = code ; *buf ; buf++ )if ( *buf == '\n' || *buf == '\r' )*buf = '\0';
  121.                             outfile = Open( code, MODE_NEWFILE );
  122.                         }
  123.                         else outfile = NULL;
  124.                     }
  125.                 } else if ( outfile )bust_me( outfile, buf, name, ver, rev, DOSBase );
  126.                 Close( file );
  127.                 if ( outfile )Close( outfile );
  128.             }
  129.             FreeArgs( rargs );
  130.         }
  131.         CloseLibrary( DOSBase );
  132.     }
  133.     return ret;
  134. }
  135.  
  136. char *strcat( unsigned long start, char *str, const char *append )
  137. {
  138.     str[start] = '\0';
  139.     return strcat2( str, append );
  140. }
  141.  
  142. char *strcat2( char *str, const char *append )
  143. {
  144.     char *ret = str;
  145.  
  146.     while( *str )str++;
  147.     while( *append && *append != '\n' && *append != '\r' )*str++ = *append++;
  148.     *str = '\0';
  149.     return ret;
  150. }
  151.  
  152. long strcmp( const char *a, const char *b )
  153. {
  154.     register long n = 0;
  155.     for ( ; a[n] && b[n] ; n++ )if ( LOWER(a[n]) != LOWER(b[n]) )return 0;
  156.     return n;
  157. }
  158.  
  159. void bust_me( BPTR file, const char *from, char *name, int ver, int rev, struct Library *DOSBase )
  160. {
  161.     char buf[MAX_BUFFER], date[9] = { "XX.XX.XX\0" }, time[9] = { "XX:XX:XX\0" }, *txt;
  162.     int n = 0, num = 0;
  163.     struct DateTime dt = { { 0, 0, 0 }, FORMAT_CDN, 0, NULL, date, time };
  164.  
  165.     DateStamp( &dt.dat_Stamp );
  166.     DateToStr( &dt );
  167.     date[2] = date[5] = '.';
  168.     for ( txt = ld ; *from != '\0' ; txt = ld, num = 0 )
  169.     {
  170.         for( n = 0 ; *from != '%' && *from != '\0' ; buf[n++] = *from++ );
  171.         if ( n )buf[n] = '\0', VFPrintf( file, (char *)&buf, (void *)0 );
  172.         if ( *from++ == '%' )
  173.         {
  174.             switch( *from++ )
  175.             {
  176.                 case 'v':    num = ver;        break;
  177.                 case 'r':    num = rev;        break;
  178.                 case 'd':    txt = date;        break;
  179.                 case 't':    txt = time;        break;
  180.                 case 'n':    txt = name;        break;
  181.                 case 'V':    txt = vers;        break;
  182.                 case 'l':
  183.                     switch( *from++ )
  184.                     {
  185.                         case 'v':    while ( ver >= (10^(++num)) );    break;
  186.                         case 'r':    while ( rev >= (10^(++num)) );    break;
  187.                         case 'd':    num = 8;                                    break;
  188.                         case 't':    num = 8;                                    break;
  189.                         case 'n':    while ( name[++num] != '\0' );    break;
  190.                         case 'V':    while ( vers[++num] != '\0' );    break;
  191.                         default:        txt = NULL;                                break;
  192.                     }
  193.                     break;
  194.                 case '%':    txt = "%%";        break;
  195.                 default:        txt = NULL;        break;
  196.             }
  197.             if ( txt != NULL )VFPrintf( file, txt, &num );
  198.         } else --from;
  199.     }
  200. }
  201.